package com.whfp.afs330h_sdk.afs330h;


import com.clj.fastble.callback.BleMtuChangedCallback;
import com.clj.fastble.data.BleDevice;
import com.whfp.afs330h_sdk.callback.ConnectCallback;
import com.whfp.afs330h_sdk.callback.DeviceCallback;

/**
 * AFS330H设备接口
 */
public interface BtManager {


    /**
     * 设置最大传输单元MTU
     *
     * @param bleDevice 要设置的设备
     * @param mtu       最大传输单元（单位：字节）
     * @param callback  回调
     */
    void setMtu(BleDevice bleDevice, int mtu, BleMtuChangedCallback callback);

    /**
     * 连接破冰2号设备
     *
     * @param address  设备mac地址
     * @param callback 回调函数
     */
    void connectDevice(String address, ConnectCallback callback);

    /**
     * 连接设备（传递过来的就是解析好的MAC地址，此方法不对传入的MAC地址做解析，直接连接）
     *
     * @param mac        要连接的设备MAC地址
     * @param deviceType 设备类型
     * @param callback   回调事件
     */
    void connectDeviceNoParsing(String mac, int deviceType, ConnectCallback callback);

    /**
     * 连接设备（传递过来的就是解析好的MAC地址，此方法不对传入的MAC地址做解析，直接连接）
     *
     * @param mac      传入的MAC地址
     * @param refType  设备型号
     * @param callback 回调函数
     */
    void connectDeviceNoParsing(String mac, String refType, ConnectCallback callback);

    /**
     * 获取设备状态
     *
     * @param bleDevice 已连接设备对象
     * @param isJCSJKZT 是否检测试剂卡状态
     */
    void getDeviceStatus(BleDevice bleDevice, boolean isJCSJKZT);

    /**
     * 获取当前已连接设备
     *
     * @return 当前已连接设备，未连接既为null
     */
    BleDevice getCurrentDevice();

    /**
     * 断开连接
     *
     * @param bleDevice
     */
    void disConnect(BleDevice bleDevice);

    /**
     * 订阅通知  接收数据
     *
     * @param bleDevice      已连接设备对象
     * @param deviceCallback 回调函数
     */
    void openNotify(BleDevice bleDevice, DeviceCallback deviceCallback);

    /**
     * 破冰二合一设备订阅通知  接收数据
     *
     * @param bleDevice      已连接设备对象
     * @param deviceCallback 回调函数
     */
    void openNotifyEHY(BleDevice bleDevice, DeviceCallback deviceCallback);

    /**
     * 取消订阅通知
     *
     * @param bleDevice 已订阅通知的设备对象
     * @return
     */
    boolean stopNotify(BleDevice bleDevice);

    /**
     * 开始毒品检测（不对传的码做解析和验证）
     *
     * @param bleDevice 当前已连接设备
     * @param code      当前已解析完毕的标曲编号
     */
    void startTest(BleDevice bleDevice, String code);

    /**
     * 开始毒品检测（传入条码前5位）
     *
     * @param bleDevice 当前已连接设备
     * @param barcode   试剂卡条码前5位
     */
    void startTestBarCode(BleDevice bleDevice, String barcode);

    /**
     * 开始毒品检测（传入按帧稀的规定加密后的二维码内容）
     *
     * @param bleDevice 当前已连接设备
     * @param qrCode    加密后的二维码内容
     */
    void startTestQrCode(BleDevice bleDevice, String qrCode);

    /**
     * 读取设备项目和ID卡
     *
     * @param bleDevice 当前已连接设备
     * @param isFGZJXM  是否覆盖最旧项目
     */
    void readDeviceProject(BleDevice bleDevice, boolean isFGZJXM);

    /**
     * 加载云端项目
     *
     * @param bleDevice   当前已连接设备
     * @param isFGZJXM    是否覆盖最旧项目
     * @param projectData 项目数据（4096字节数据）
     */
    void loadCloudProject(BleDevice bleDevice, boolean isFGZJXM, String projectData);

    /**
     * 删除设备项目
     *
     * @param bleDevice 当前已连接设备
     * @param barCode   要删除的项目条码
     */
    void deleteDeviceProject(BleDevice bleDevice, String barCode);

    /**
     * 断开所有设备
     */
    void disconnectAllDevice();

    /**
     * 退出使用
     */
    void quitApply();

    /**
     * 打开蓝牙
     */
    void openBlue();

    /**
     * 蓝牙是否已打开
     *
     * @return
     */
    boolean isBlueEnable();

    /**
     * 解码Base64编码字符串的字符串
     *
     * @param str 要解码的字符串
     * @return 解码后的字符串
     * @throws Exception
     */
    String base64Decode(String str) throws Exception;

}
